package com.yxy.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.util.StdDateFormat;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;

/**
 * JSON响应工具类，用于将对象序列化为JSON并写入HTTP响应
 * 统一使用Jackson进行JSON处理
 * @Author 杨芯叶
 * @Create 2025-07-31-11:08
 */
public class JsonWriter {

    /**
     * 将对象序列化为JSON并写入响应（使用Jackson）
     * @param data 要序列化的对象
     * @param response HTTP响应对象
     */
    public static void write(Object data, HttpServletResponse response) {
        write(data, response, null);
    }

    /**
     * 将对象序列化为JSON并写入响应（使用Jackson，支持日期格式化）
     * @param data 要序列化的对象
     * @param response HTTP响应对象
     * @param dateFormat 日期格式化字符串，如"yyyy-MM-dd HH:mm:ss"
     */
    public static void write(Object data, HttpServletResponse response, String dateFormat) {
        PrintWriter writer = null;
        try {
            // 设置正确的Content-Type和字符编码
            response.setContentType("application/json;charset=utf-8");
            writer = response.getWriter();

            ObjectMapper mapper = new ObjectMapper();

            // 如果指定了日期格式，则进行设置
            if (dateFormat != null && !dateFormat.isEmpty()) {
                mapper.setDateFormat(new SimpleDateFormat(dateFormat));
            } else {
                // 使用默认日期格式
                mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
                mapper.setDateFormat(StdDateFormat.instance);
            }

            mapper.writeValue(writer, data);
            writer.flush(); // 确保数据写入响应
        } catch (IOException e) {
            throw new RuntimeException("JSON序列化失败", e);
        } finally {
            // 安全关闭资源
            if (writer != null) {
                try {
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
